package com.serviportales.serviquality.maestroProyectos.beans;

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.swing.tree.DefaultMutableTreeNode;

import org.apache.log4j.Logger;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;

import com.liferay.util.bridges.jsf.common.FacesMessageUtil;
import com.rits.cloning.Cloner;
import com.serviportales.serviportales.beans.Contexto;
import com.serviportales.serviportales.model.GenericNodeUserObject;
import com.serviportales.serviportales.model.GenericTreeModel;
import com.serviportales.serviportales.utils.SessionUtils;
import com.serviportales.serviquality.exception.ServiqualityException;
import com.serviportales.serviquality.managers.MgrProyectoNodo;
import com.serviportales.serviquality.model.Proyecto;
import com.serviportales.serviquality.model.ProyectoNodo;

@ManagedBean(name = "fcTreeProyecto", eager = true)
@ViewScoped
public class FCTreeProyecto implements Serializable {

	private static final long serialVersionUID = 1L;

	private Logger logger = Logger.getLogger(getClass());

	private Proyecto proyecto;

	// Tree
	private ProyectoNodo proyectoNodoSelected;
	private DefaultMutableTreeNode dmTreeNodeSelected;
	private GenericTreeModel<ProyectoNodo> proyectoTreeModel;
	private Boolean snNodoSel;

	@PostConstruct
	public void init() {
		snNodoSel = false;
		proyectoNodoSelected = new ProyectoNodo();

		proyectoTreeModel = new GenericTreeModel<ProyectoNodo>();
		proyectoTreeModel.setRootNode("", proyectoNodoSelected);
		dmTreeNodeSelected = (DefaultMutableTreeNode) proyectoTreeModel.getRoot();
	}

	public Boolean getSnNodoSel() {
		return snNodoSel;
	}

	public void setSnNodoSel(Boolean snNodoSel) {
		this.snNodoSel = snNodoSel;
	}

	public Proyecto getProyecto() {
		return proyecto;
	}

	public void setProyecto(Proyecto proyecto) {
		Cloner cloner = new Cloner();
		FacesContext context = FacesContext.getCurrentInstance();
		MessageSource messageSource = Contexto.getMessageSource();
		try {
			proyectoNodoSelected = new ProyectoNodo();
			this.proyecto = cloner.deepClone(proyecto);
			MgrProyectoNodo mgrProyectoNodo = ((MgrProyectoNodo) Contexto.getApplicationContext().getBean("mgrProyectoNodo"));
			proyectoTreeModel = mgrProyectoNodo.createTree(proyecto);
		} catch (ServiqualityException serviqualityException) {
			FacesMessageUtil.error(context, messageSource.getMessage(serviqualityException.getMessage(), null, LocaleContextHolder.getLocale()));
			logger.error(serviqualityException.getMessage(), serviqualityException);
		}
	}

	public DefaultMutableTreeNode getDmTreeNodeSelected() {
		return dmTreeNodeSelected;
	}

	public void setDmTreeNodeSelected(DefaultMutableTreeNode dmTreeNodeSelected) {
		this.dmTreeNodeSelected = dmTreeNodeSelected;
	}

	public ProyectoNodo getProyectoNodoSelected() {
		return proyectoNodoSelected;
	}

	public void setProyectoNodoSelected(ProyectoNodo proyectoNodoSelected) {
		this.proyectoNodoSelected = proyectoNodoSelected;
	}

	public GenericTreeModel<ProyectoNodo> getProyectoTreeModel() {
		return proyectoTreeModel;
	}

	public void setProyectoTreeModel(GenericTreeModel<ProyectoNodo> proyectoTreeModel) {
		this.proyectoTreeModel = proyectoTreeModel;
	}

	@SuppressWarnings("unchecked")
	public void nodeSelected(ActionEvent event) {
		Cloner cloner = new Cloner();
		FacesContext context = FacesContext.getCurrentInstance();
		String idNodo = SessionUtils.getRequesParameter(context, "idNodo");
		dmTreeNodeSelected = proyectoTreeModel.findNode(idNodo);
		GenericNodeUserObject<ProyectoNodo> genericNodeUserObject = (GenericNodeUserObject<ProyectoNodo>) dmTreeNodeSelected.getUserObject();
		ProyectoNodo proyectoNodoTree = cloner.deepClone((genericNodeUserObject).getValue());
		if (!dmTreeNodeSelected.equals(proyectoTreeModel.getRoot())) {
			proyectoNodoSelected = proyectoNodoTree;
			snNodoSel = true;
		} else {
			proyectoNodoSelected = new ProyectoNodo();
			snNodoSel = false;
		}
	}

	@SuppressWarnings("unchecked")
	public void grabarProyectoNodo() {
		FacesContext context = FacesContext.getCurrentInstance();
		MessageSource messageSource = Contexto.getMessageSource();
		try {
			if (proyectoNodoSelected.getProyectoNodoPK().getProyecto() == null) {
				FacesMessageUtil.error(context, messageSource.getMessage(ServiqualityException.SELECCIONAR_REGISTRO_ERROR, null, LocaleContextHolder.getLocale()));
			} else {
				MgrProyectoNodo mgrProyectoNodo = ((MgrProyectoNodo) Contexto.getApplicationContext().getBean("mgrProyectoNodo"));
				mgrProyectoNodo.grabarProyectoNodo(proyectoNodoSelected);
				FacesMessageUtil.info(context, messageSource.getMessage(ServiqualityException.GRABAR_EXITO, null, LocaleContextHolder.getLocale()));
				
				Cloner cloner = new Cloner();
				ProyectoNodo proyectoNodoTree = cloner.deepClone(proyectoNodoSelected);
				GenericNodeUserObject<ProyectoNodo> genericNodeUserObject = (GenericNodeUserObject<ProyectoNodo>) dmTreeNodeSelected.getUserObject();
				genericNodeUserObject.setValue(proyectoNodoTree);				
				
			}

		} catch (ServiqualityException serviqualityException) {
			FacesMessageUtil.error(context, messageSource.getMessage(serviqualityException.getMessage(), null, LocaleContextHolder.getLocale()));
			logger.error(serviqualityException.getMessage(), serviqualityException);
		}
	}

	public void refreshProyecto() {
		FacesContext context = FacesContext.getCurrentInstance();
		MessageSource messageSource = Contexto.getMessageSource();
		try {
			MgrProyectoNodo mgrProyectoNodo = ((MgrProyectoNodo) Contexto.getApplicationContext().getBean("mgrProyectoNodo"));
			proyectoTreeModel = mgrProyectoNodo.createTree(proyecto);
		} catch (ServiqualityException serviqualityException) {
			FacesMessageUtil.error(context, messageSource.getMessage(serviqualityException.getMessage(), null, LocaleContextHolder.getLocale()));
			logger.error(serviqualityException.getMessage(), serviqualityException);
		}
	}
}
